home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-01-26 | 27.0 KB | 858 lines | [TEXT/MPS ] |
- %%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%
- %%%%% boxedeps.tex
- %%%%% MACROS FOR FIGURE INSERTS OF EPSF NORM %%%%%
- %%%%% (EPSF = Encapsulated PostScript File)
- %%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%
- %%% AUTHOR: Laurent Siebenmann
- %% lcs@topo.math.u-psud.fr
- %%
- %%% VERSIONS: Feb 1991 -- Jan 1995
- %%
- %%% SOMMAIRE: boxedeps.tex d\'efinit des macro-commandes
- %% qui permettent d'int\'egrer dans un document TeX des
- %% objets graphiques d\'ecrits par fichier de norme EPSF,
- %% tout en accordant a chacun le statut d'une bo\^ite TeX ayant
- %% les bonnes dimensions. La (seule!) contribution unique
- %% de ce fichier est de faire cela d'une fa{\c}con universelle.
- %% C'est a dire de fa{\c}con \`a pouvoir commod\'ement
- %% servir avec tout pilote d'imprimante de norme
- %% PostScript --- malgr\'e l'absence d'une norme
- %% pour \special.
- %%
- %%%% ACTIVATION:
- %% by a driver-by-driver protocol
- %% see \SetTexturesEPSFSpecial
- %% and its companions below.
- %%
- %%%% DOCUMENTATION:
- %% --- see boxedeps.doc
- %% The complete utility is called BoxedEPSF
- %%
- %%%% POSTINGS: anonymous ftp
- %% --- ftp matups.math.u-psud.fr [192.54.146.4]
- %% This is the master copy in 1994.
- %% --- ftp.uni-stuttgart.de
- %% --- ftp ftp.TeX.AC.UK
- %% --- ftp ftp.SHSU.edu
- %% Locate the full package on these three
- %% "CTAN" servers by using (while connected) the command
- %% QUOTE SITE INDEX boxedeps
-
- \ifx\MYUNDEFINED\BoxedEPSF
- \let\temp\relax
- \else
- \message{}
- \message{ !!! \string\BoxedEPSF or \string\BoxedArt %
- macros already defined !!!}
- \let\temp\endinput
- \fi
- \temp
-
- \chardef\EPSFCatAt\the\catcode`\@
- \catcode`\@=11
-
- \chardef\C@tColon\the\catcode`\:
- \chardef\C@tSemicolon\the\catcode`\;
- \chardef\C@tQmark\the\catcode`\?
- \chardef\C@tEmark\the\catcode`\!
- \chardef\C@tDqt\the\catcode`\"
-
- \def\PunctOther@{\catcode`\:=12
- \catcode`\;=12 \catcode`\?=12 \catcode`\!=12 \catcode`\"=12}
- \PunctOther@
-
- %%temporarily suppress Plain's logging of allocations
- \let\wlog@ld\wlog
- \def\wlog#1{\relax}
-
- %% New for TOOLS
- %\newif\ifIN@
- \newdimen\XShift@ \newdimen\YShift@
- \newtoks\Realtoks
-
- %%% New for BoxedEPSF
- %
- \newdimen\Wd@ \newdimen\Ht@
- \newdimen\Wd@@ \newdimen\Ht@@
- %
- \newdimen\TT@
- \newdimen\LT@
- \newdimen\BT@
- \newdimen\RT@
- %
- \newdimen\XSlide@ \newdimen\YSlide@
- %
- \newdimen\TheScale %% secretly scale in mils: 1pt= 1mil
- \newdimen\FigScale %% secretly scale in mils: 1pt= 1mil
- %
- \newdimen\ForcedDim@@
-
- \newtoks\EPSFDirectorytoks@
- \newtoks\EPSFNametoks@
- \newtoks\BdBoxtoks@
- \newtoks\LLXtoks@ %% useful info for Oz
- \newtoks\LLYtoks@
- \newtoks\URXtoks@ %% further useful epsf.tex syntax
- \newtoks\URYtoks@
-
-
- \newif\ifNotIn@
- \newif\ifForcedDim@
- \newif\ifForceOn@
- \newif\ifForcedHeight@
- \newif\ifPSOrigin
-
- \newread\EPSFile@
-
- %%%% MESSAGES (separate macro best for Europe)
- %%
- \def\ms@g{\immediate\write16}
-
- %%%% WORD-PROCESSING MACROS
- %%
- %%% \IN@0#1@#2@ : Is 1st exp of #1 in 1st exp of #2 ??
- %% Answer in \ifIN@
- \newif\ifIN@\def\IN@{\expandafter\INN@\expandafter}
- \long\def\INN@0#1@#2@{\long\def\NI@##1#1##2##3\ENDNI@
- {\ifx\m@rker##2\IN@false\else\IN@true\fi}%
- \expandafter\NI@#2@@#1\m@rker\ENDNI@}
- \def\m@rker{\m@@rker}
-
- %%% \SPLIT@0#1@#2@ : Split 1st exp of #2 at 1st exp of #1
- %% \Initialtoks@ , \Terminaltoks@ will contain pieces
- \newtoks\Initialtoks@ \newtoks\Terminaltoks@
- \def\SPLIT@{\expandafter\SPLITT@\expandafter}
- \def\SPLITT@0#1@#2@{\def\TTILPS@##1#1##2@{%
- \Initialtoks@{##1}\Terminaltoks@{##2}}\expandafter\TTILPS@#2@}
-
- %%%% MACROS TO TRIM \ForeTrim@0#1@ and \Trim@0#1@
- %% result appears in \Trimtoks@
- %% LIMITATION: assume no multiple spaces to trim
-
- \newtoks\Trimtoks@
-
- %%% \ForeTrim@0#1@ trims initial space of first erpansion of #1
- %% #1 of form \the\toks0 or \mymacro
- \def\ForeTrim@{\expandafter\ForeTrim@@\expandafter}
- \def\ForePrim@0 #1@{\Trimtoks@{#1}}
- \def\ForeTrim@@0#1@{\IN@0\m@rker. @\m@rker.#1@%
- \ifIN@\ForePrim@0#1@%
- \else\Trimtoks@\expandafter{#1}\fi}
- %%\m@rker expands here to \m@@rker since spot initial,
- %% so no confusuion with \m@rker
-
- %%% \Trim@0#1@ trims init and terminal spaces
- %% Same syntax.
- %% Warns if internal spaces found.
- %%
- \def\Trim@0#1@{%
- \ForeTrim@0#1@%
- \IN@0 @\the\Trimtoks@ @%
- \ifIN@
- \SPLIT@0 @\the\Trimtoks@ @\Trimtoks@\Initialtoks@
- \IN@0\the\Terminaltoks@ @ @%
- \ifIN@
- \else \Trimtoks@ {FigNameWithSpace}%
- \fi
- \fi
- }
-
-
- %%%% MATH MACROS (provisional)
- %% use dimen registers for reals; unit 1pt
- %% (numerical dimension arguments OK unless contrary noted)
-
- %%%% One needs the point token seq (pt with cat 12) USES dimen 0
- \newtoks\pt@ks
- \def\getpt@ks 0.0#1@{\pt@ks{#1}}
- \dimen0=0pt\relax\expandafter\getpt@ks\the\dimen0@
-
- %%% Convert dimen to "decimal multiplier"% USES dimens 0,2
- %\newtoks\Realtoks% the output!
- \def\Real#1{%
- \dimen2=#1%
- \SPLIT@0\the\pt@ks @\the\dimen2@%% lop off the points
- \Realtoks=\Initialtoks@ %\showthe\Realtoks
- }
-
- %%% Multiplication
- % USES dimens 0,2,4,6; preserves args; output \Product
- \newdimen\Product
- \def\Mult#1#2{%
- \dimen4=#1\relax
- \dimen6=#2%
- \Real{\dimen4}%
- \Product=\the\Realtoks\dimen6%
- }
-
- %%% Inverse
- % USES dimens 0; preserves arg; output \Inverse
- \newdimen\Inverse
- \newdimen\hmxdim@ \hmxdim@=8192pt%halfmaxdimen
- \def\Invert#1{%
- \Inverse=\hmxdim@
- \dimen0=#1%
- \divide\Inverse \dimen0%
- \multiply\Inverse 8}
-
- %%% \Rescale#1#2#3 % USES dimens 0,2,4,6
- %% alters dimen register #1 by ratio #2/#3
- %% where #2,#3 can be raw dimensions OR dimen registers
- \def\Rescale#1#2#3{% Adequate accuracy. Can improve.
- \divide #1 by 100\relax
- \dimen2=#3\divide\dimen2 by 100 \Invert{\dimen2}%
- \Mult{#1}{#2}%
- \Mult\Product\Inverse
- #1=\Product}
-
- %%% \Scale#1 scales dimen register #1
- %% by dimen register real \TheScale; USES dimens 0
- \def\Scale#1{\dimen0=\TheScale
- \divide #1 by 1280 %% 1280*5120*10=1000*2^16
- \divide \dimen0 by 5120
- \multiply#1 by \dimen0
- \divide#1 by 10 %% max size of #1 about 32000/10 pt
- }
-
- %%% SCRUNCHING BOXES AND SHIFTING CONTENTS
- %% TeX has to do this in general
- %% since some drivers do not let
- %% one do it readily using Postscript
-
- \newbox\scrunchbox
-
- %%% \Scrunched#1 puts #1 in an hbox
- %% then in effect zeros the dimensions of this box
- \def\Scrunched#1{{\setbox\scrunchbox\hbox{#1}%
- \wd\scrunchbox=0pt
- \ht\scrunchbox=0pt
- \dp\scrunchbox=0pt
- \box\scrunchbox}}
-
- %%% \Shifted@#1 puts #1 in \hbox
- %% then locates basepoint to bottom left corner
- %% then translates ink only by \XShift@,\YShift@
- %% with Postscript convention
- %% For simplicity use only on scrunched boxes
- %\newdimen\XShift@
- %\newdimen\YShift@
- \def\Shifted@#1{%
- \vbox {\kern-\YShift@
- \hbox {\kern\XShift@\hbox{#1}\kern-\XShift@}%
- \kern\YShift@}}
-
- %%% \cBoxedEPSF#1 the main macro
- %% component macros are explained in order below
-
- \def\cBoxedEPSF#1{{\leavevmode
- %% double brace for amstex \allign, \alligned, ...
- \ReadNameAndScale@{#1}%
- \SetEPSFSpec@
- \ReadEPSFile@ \ReadBdB@x
- %% Calculations
- \TrimFigDims@
- \CalculateFigScale@
- \ScaleFigDims@
- \SetInkShift@
- \hbox{$\mathsurround=0pt\relax
- \vcenter{\hbox{%
- \FrameSpider{\hskip-.4pt\vrule}%
- \vbox to \Ht@{\offinterlineskip\parindent=\z@%
- \FrameSpider{\vskip-.4pt\hrule}\vfil
- \hbox to \Wd@{\hfil}%
- \vfil
- \InkShift@{\EPSFSpecial{\EPSFSpec@}{\FigSc@leReal}}%
- \FrameSpider{\hrule\vskip-.4pt}}%
- \FrameSpider{\vrule\hskip-.4pt}}}%
- $\relax}%
- \CleanRegisters@
- \ms@g{ *** Box composed for the %
- EPS file \the\EPSFNametoks@}%
- }}
-
- \def\tBoxedEPSF#1{\setbox4\hbox{\cBoxedEPSF{#1}}%
- \setbox4\hbox{\raise -\ht4 \hbox{\box4}}%
- \box4
- }
-
- \def\bBoxedEPSF#1{\setbox4\hbox{\cBoxedEPSF{#1}}%
- \setbox4\hbox{\raise \dp4 \hbox{\box4}}%
- \box4
- }
-
- \let\BoxedEPSF\cBoxedEPSF% default setting
-
- %% Some compatibility with BoxedArt.tex
- %
- \let\BoxedArt\BoxedEPSF
-
- %% Some compatibility with Sweet-teX
- %
- \def\gLinefigure[#1scaled#2]_#3{%
- \BoxedEPSF{#3 scaled #2}}
-
- %% Some compatibility with Rokicki's dvips
- %
- \let\EPSFbox\bBoxedEPSF \let\EPSFfile\bBoxedEPSF
-
- \def\EPSFxsize{\afterassignment\ForceW@\ForcedDim@@}
- \def\ForceW@{\ForcedDim@true\ForcedHeight@false}
-
- \def\EPSFysize{\afterassignment\ForceH@\ForcedDim@@}
- \def\ForceH@{\ForcedDim@true\ForcedHeight@true}
-
- \def\EmulateRokicki{%
- \let\epsfbox\bBoxedEPSF \let\epsffile\bBoxedEPSF
- \let\epsfxsize\EPSFxsize \let\epsfysize\EPSFysize}
-
- %%% \ReadNameAndScale@#1
- %
- \def\ReadNameAndScale@#1{\IN@0 scaled@#1@% DOUBLE BARRELED
- \ifIN@\ReadNameAndScale@@0#1@%
- \else \ReadNameAndScale@@0#1 scaled\DefaultMilScale @%
- \fi}
-
- \def\ReadNameAndScale@@0#1scaled#2@{% HELPER MACRO
- \let\OldBackslash@\\%
- \def\\{\OtherB@ckslash}%
- \edef\temp@{#1}%
- \Trim@0\temp@ @%
- \EPSFNametoks@\expandafter{\the\Trimtoks@ }%
- \FigScale=#2 pt%
- \let\\\OldBackslash@
- }
-
- \def\SetDefaultEPSFScale#1{%
- \global\def\DefaultMilScale{#1}}
-
- \SetDefaultEPSFScale{1000}
-
-
- %%% \ReadEPSFile@
- %
- \def \SetBogusBbox@{%
- \global\BdBoxtoks@{ BoundingBox:0 0 100 100 }%
- \global\def\BdBoxLine@{ BoundingBox:0 0 100 100 }%
- \ms@g{ !!! Will use placeholder !!!}%
- }
-
- {\catcode`\%=12\gdef\P@S@{%!}\gdef\pct@@{%%}} %% %! min sign of PS file
-
- \def\ReadEPSFile@{%\show\EPSFSpec@%
- \openin\EPSFile@\EPSFSpec@
- \relax %necessary to prevent precocious expansion of \ifeof
- \ifeof\EPSFile@
- \ms@g{}%
- \ms@g{ !!! EPS FILE \the\EPSFDirectorytoks@
- \the\EPSFNametoks@\space WAS NOT FOUND !!!}%
- \SetBogusBbox@
- \else%\fi
- \begingroup%%
- \catcode`\%=12\catcode`\:=12\catcode`\!=12
- \catcode"00=14 \catcode"7F=14 \catcode`\\=14
- %% 14 = comment, terminates input line;
- %% 5 = CR just picks up extra space
- \global\read\EPSFile@ to \BdBoxLine@ %\show\BdBoxLine@
- \IN@0\P@S@ @\BdBoxLine@ @%
- \ifIN@ %% %! accepted as %!PS so do BdBox search!!
- \NotIn@true
- \loop
- \ifeof\EPSFile@\NotIn@false
- \ms@g{}%
- \ms@g{ !!! BoundingBox NOT FOUND IN %
- \the\EPSFDirectorytoks@\the\EPSFNametoks@\space!!! }%
- \SetBogusBbox@
- \else\global\read\EPSFile@ to \BdBoxLine@
- %\show\BdBoxLine@
- \fi
- \global\BdBoxtoks@\expandafter{\BdBoxLine@}%
- \IN@0BoundingBox:@\the\BdBoxtoks@ @%
- \ifIN@\NotIn@false\fi%
- \ifNotIn@
- \repeat
- \else
- \ms@g{}%
- \ms@g{ !!! \the\EPSFNametoks@\space is not PostScript.}%
- \ms@g{ !!! It should begin with the "\P@S@". }%
- \ms@g{ !!! Also, all other header lines until }%
- \ms@g{ !!! "\pct@@ EndComments" should begin with "\pct@@". }%
- \SetBogusBbox@
- \fi
- \endgroup\relax
- \fi
- \closein\EPSFile@
- }
-
-
- %%% \ReadBdB@x
- % Rmk For simplicity 0 not used in syntax
- % of \ReadBdB@x@, \ReadBdB@x@@
- \def\ReadBdB@x{% PART 0
- \expandafter\ReadBdB@x@\the\BdBoxtoks@ @}
-
- \def\ReadBdB@x@#1BoundingBox:#2@{% PART 1
- \ForeTrim@0#2@%
- \IN@0atend@\the\Trimtoks@ @%
- \ifIN@ \Trimtoks@={0 0 100 100 }%
- \ms@g{}%
- \ms@g{ !!! BoundingBox not found in %
- \the\EPSFDirectorytoks@\the\EPSFNametoks@\space !!!}%
- \ms@g{ !!! It must not be at end of EPSF !!!}%
- \ms@g{ !!! Will use placeholder !!!}%
- \fi%% cf \SetBogusBbox@
- \expandafter\ReadBdB@x@@\the\Trimtoks@ @%
- }
-
- \def\ReadBdB@x@@#1 #2 #3 #4@{% PART 2
- \Wd@=#3bp\advance\Wd@ by -#1bp%
- \Ht@=#4bp\advance\Ht@ by-#2bp%
- \Wd@@=\Wd@ \Ht@@=\Ht@ %% useful info for Clark
- \LLXtoks@={#1}\LLYtoks@={#2}%% useful for Oz
- \URXtoks@={#3}\URYtoks@={#4}%% useful for epsf.tex
- \ifPSOrigin\XShift@=-#1bp\YShift@=-#2bp\fi
- }
-
- %%% \SetEPSFDirectory
- %
- \def\G@bbl@#1{}
- \bgroup
- \global\edef\OtherB@ckslash{\expandafter\G@bbl@\string\\}
- \egroup
-
- \def\SetEPSFDirectory{% Part 1
- \bgroup\PunctOther@\relax
- \let\\\OtherB@ckslash
- \SetEPSFDirectory@}
-
- \def\SetEPSFDirectory@#1{% Part 2
- \edef\temp@{#1}%
- \Trim@0\temp@ @% result in \Trimtoks@
- \global\toks1\expandafter{\the\Trimtoks@ }\relax
- \egroup
- \EPSFDirectorytoks@=\toks1
- }
-
- \def\SetEPSFSpec@{%
- \bgroup
- \let\\=\OtherB@ckslash
- \global\edef\EPSFSpec@{%
- \the\EPSFDirectorytoks@\the\EPSFNametoks@}%
- \global\edef\EPSFSpec@{\EPSFSpec@}%
- \egroup}
-
- %%% \TrimFigDims@
- %
- \def\TrimTop#1{\advance\TT@ by #1}
- \def\TrimLeft#1{\advance\LT@ by #1}
- \def\TrimBottom#1{\advance\BT@ by #1}
- \def\TrimRight#1{\advance\RT@ by #1}
-
- \def\TrimBoundingBox#1{%
- \TrimTop{#1}%
- \TrimLeft{#1}%
- \TrimBottom{#1}%
- \TrimRight{#1}%
- }
-
- \def\TrimFigDims@{%
- \advance\Wd@ by -\LT@
- \advance\Wd@ by -\RT@ \RT@=\z@
- \advance\Ht@ by -\TT@ \TT@=\z@
- \advance\Ht@ by -\BT@
- }
-
-
- %%% \CalculateFigScale@
- %
- \def\ForceWidth#1{\ForcedDim@true
- \ForcedDim@@#1\ForcedHeight@false}
-
- \def\ForceHeight#1{\ForcedDim@true
- \ForcedDim@@=#1\ForcedHeight@true}
-
- \def\ForceOn{\ForceOn@true}
- \def\ForceOff{\ForceOn@false\ForcedDim@false}
-
- \def\CalculateFigScale@{%
- %Have default \FigScale or read \FigScale
- \ifForcedDim@\FigScale=1000pt% %% start afresh
- \ifForcedHeight@
- \Rescale\FigScale\ForcedDim@@\Ht@
- \else
- \Rescale\FigScale\ForcedDim@@\Wd@
- \fi
- \fi
- \Real{\FigScale}%
- \edef\FigSc@leReal{\the\Realtoks}%
- }
-
- \def\ScaleFigDims@{\TheScale=\FigScale
- \ifForcedDim@
- \ifForcedHeight@ \Ht@=\ForcedDim@@ \Scale\Wd@
- \else \Wd@=\ForcedDim@@ \Scale\Ht@
- \fi
- \else \Scale\Wd@\Scale\Ht@
- \fi
- \ifForceOn@\relax\else\global\ForcedDim@false\fi
- \Scale\LT@\Scale\BT@ %%%\Scale\Wd@\Scale\Ht@
- \Scale\XShift@\Scale\YShift@
- }
-
- %%% \ShowDisplacementBoxes
- %% shows (prints) corrected scaled and positioned
- %% bounding boxes; for diagnostics
- %%% \HideDisplacementBoxes makes them invisible again
- %%
- \def\HideDisplacementBoxes{\global\def\FrameSpider##1{\null}}
- \def\ShowDisplacementBoxes{\global\def\FrameSpider##1{##1}}
- \let\HideFigureFrames\HideDisplacementBoxes %% some synonyms
- \let\ShowFigureFrames\ShowDisplacementBoxes
- \ShowDisplacementBoxes
-
- %%% \hSlide#1, \vSlide#1
- %%
- \def\hSlide#1{\advance\XSlide@ by #1}
- \def\vSlide#1{\advance\YSlide@ by #1}
-
- %%% \SetInkShift@, \InkShift@#1
- %%
- \def\SetInkShift@{%
- \advance\XShift@ by -\LT@
- \advance\XShift@ by \XSlide@
- \advance\YShift@ by -\BT@
- \advance\YShift@ by -\YSlide@
- }
- %
- \def\InkShift@#1{\Shifted@{\Scrunched{#1}}}
-
- %%% \CleanRegisters@
- %
- \def\CleanRegisters@{%
- \globaldefs=1\relax
- \XShift@=\z@\YShift@=\z@\XSlide@=\z@\YSlide@=\z@
- \TT@=\z@\LT@=\z@\BT@=\z@\RT@=\z@
- \globaldefs=0\relax}
-
- %%% Special syntax for several drivers. The macros
- %% \SetTexturesEPSFSpecial %% Textures
- %% \SetUnixCoopEPSFSpecial %% dvi2ps early unix
- %% \SetBechtolsheimDVI2PSEPSFSpecial and
- %% \SetBechtolsheimDVITPSEPSFSpecial %% by S.P.Bechtolsheim
- %% \SetLisEPSFSpecial %% dvi2ps by Tony Lis
- %% \SetRokickiEPSFSpecial %% dvips by Tom Rokicki
- %% \SetOzTeXEPSFSpecial %% OzTeX (>=1.7) by Andrew Trevorrow
- %% \SetOldOzTeXEPSFSpecial %% OzTeX (1.42--1.6)
- %% \SetPSprintEPSFSpecial %% PSprint by Andrew Trevorrow
- %% --- also for OzTeX versions <= 1.41
- %% \SetArborEPSFSpecial %% ArborTeX DVILASER/PS
- %% \SetClarkEPSFSpecial %% dvitops by James Clark
- %% \SetDVIPSoneEPSFSpecial %% DVIPSONE of Y&Y same as
- %% \SetDVIWindowEPSFSpecial %% DVIWindow of Y&Y
- %% \SetBeebeEPSFSpecial %% DVIALW by N. Beebe
- %% \SetNorthlakeEPSFSpecial %% Northlake Software
- %% \SetDirectTeXEPSFSpecial %% DirectTeX by Wilfried Ricken
- %% \SetCMacTeXEPSFSpecial %% CMacTeX by Tom Kiffe
- %% \SetepsfEPSFSpecial %% will work for many:
- %% --- dvips, the Y&Y drivers, OzTeX>=1.7, DirectTeX, CMacTeX
- %% \SetStandardEPSFSpecial %% Nonexistant: Placebo below
- %%
- %% These many drivers are supported roughly
- %% by (re-)defining the macro \EPSFSpecial#1#2, where
- %% #1 = EPS file pathname (use \\ for the letter backslash)
- %% #2 = scale in mils
- %% Be wary of using strange characters in pathnames!
-
- %% Textures, Blue Sky Research, Barry Smith
- \def\SetTexturesEPSFSpecial{\PSOriginfalse%\PSOrigintrue
- \gdef\EPSFSpecial##1##2{\relax
- \edef\specialtemp{##2}%
- \SPLIT@0.@\specialtemp.@\relax
- \special{illustration ##1 scaled
- \the\Initialtoks@}}}
-
- %% Unix : dvi2ps by: Mark Senn, Stephan Bechtolsheim,
- % Bob Brown, Richard, Furuta, James Schaad, Robert Wells,
- % Norm Hutchinson, Neal Holt, Scott Jones, Howard Trickey.
- % Introduced by B. Horn <bkph@ai.mit.edu>
- \def\SetUnixCoopEPSFSpecial{\PSOrigintrue % Please test!
- \gdef\EPSFSpecial##1##2{%
- \dimen4=##2pt% convert real to dimen
- \divide\dimen4 by 1000\relax
- \Real{\dimen4}%dimens 0,2 used here
- \edef\Aux@{\the\Realtoks}%
- %%convert dimen to real
- \special{psfile=##1\space
- hscale=\Aux@\space
- vscale=\Aux@}}}
-
-
- %% dvi2ps and dvitps by S.P. Bechtolsheim,
- % Introduced by B. Horn <bkph@ai.mit.edu> and Carl.M.Jones,
- % testing by R. Evans <Robert@cm.cardiff.ac.uk>
- % and George Denk <denk@mathematik.tu-muenchen.de>
- % Note that a prolog file psfig.pro
- % specific to the driver should be available.
- \def\SetBechtolsheimEPSFSpecial@{%% tool macro only
- \PSOrigintrue
- \special{\DriverTag@ Include0 "psfig.pro"}%
- \gdef\EPSFSpecial##1##2{%
- \dimen4=##2pt %% convert real to dimen
- \divide\dimen4 by 1000\relax
- \Real{\dimen4} %% dimens 0,2 used here
- \edef\Aux@{\the\Realtoks}%% convert dimen to real
- \special{\DriverTag@ Literal "10 10 0 0 10 10 startTexFig
- \the\mag\space 1000 div
- dup 3.25 neg mul 1 index .25 neg mul translate %% correction line
- \Aux@\space mul dup scale "}%
- \special{\DriverTag@ Include1 "##1"}%
- \special{\DriverTag@ Literal "endTexFig "}%
- }}
-
- \def\SetBechtolsheimDVITPSEPSFSpecial{\def\DriverTag@{dvitps: }%
- \SetBechtolsheimEPSFSpecial@}
-
- \def\SetBechtolsheimDVI2PSEPSFSSpecial{\def\DriverTag@{DVI2PS: }%
- \SetBechtolsheimEPSFSpecial@}
-
- %% dvi2ps by Tony Lis,
- % implantations? ; dates?; availability?
- % Introduced by B. Horn <bkph@ai.mit.edu>
- \def\SetLisEPSFSpecial{\PSOrigintrue
- \gdef\EPSFSpecial##1##2{%
- \dimen4=##2pt% convert real to dimen
- \divide\dimen4 by 1000\relax
- \Real{\dimen4}% dimens 0,2 used here
- \edef\Aux@{\the\Realtoks}%
- %%convert dimen to real
- \special{pstext="10 10 0 0 10 10 startTexFig\space
- \the\mag\space 1000 div \Aux@\space mul
- \the\mag\space 1000 div \Aux@\space mul scale"}%
- \special{psfile=##1}%
- \special{pstext=endTexFig}%
- }}
-
- %% dvips by Tom Rokicki; free driver in portable C
- % Introduced by W.D. Neumann <neumann@mps.ohio-state.edu>
- \def\SetRokickiEPSFSpecial{\PSOrigintrue
- \gdef\EPSFSpecial##1##2{%
- \dimen4=##2pt% convert real to dimen
- \divide\dimen4 by 10\relax
- \Real{\dimen4}% dimens 0,2 used here
- \edef\Aux@{\the\Realtoks}%
- %%convert dimen to real
- \special{psfile="##1"\space
- hscale=\Aux@\space
- vscale=\Aux@}}}
-
- \def\SetInlineRokickiEPSFSpecial{\PSOrigintrue
- \gdef\EPSFSpecial##1##2{%
- \dimen4=##2pt% convert real to dimen
- \divide\dimen4 by 1000\relax
- \Real{\dimen4}% dimens 0,2 used here
- \edef\Aux@{\the\Realtoks}%
- %%convert dimen to real
- \special{ps::[begin] 10 10 0 0 10 10 startTexFig\space
- \the\mag\space 1000 div \Aux@\space mul
- \the\mag\space 1000 div \Aux@\space mul scale}%
- \special{ps: plotfile ##1}%
- \special{ps::[end] endTexFig}%
- }}
-
- %%% Rokicki's epsf.tex syntax.
- %% Is followed by Direct TeX (W. Ricken)
- %% and cMacTeX (Tom Kiffe)
- %% Is alternative syntax for Y&Y's drivers and
- %% for OzTeX >= 1.7
- \def\SetepsfEPSFSpecial{\PSOriginfalse
- \gdef\epsfclipstring{}%
- %% make { clip} if you want to clip (non-portably)
- %% down to the PostScript bounding box.
- \gdef\EPSFSpecial##1##2{%
- \dimen6=\the\URXtoks@ pt %% not bp!!!!!
- \advance\dimen6 by -\the\LLXtoks@ pt
- %\showthe\dimen6
- %% \dimen6 now bbox width * points
- \dimen4=##2pt %% convert mil scale to dimen
- \divide\dimen4 by 100 %% 1000ths to 10ths
- \Real{\dimen4}%% dimens 0,2 used here
- \dimen6=\the\Realtoks\dimen6
- \Real{\dimen6}%% dimens 0,2 used here
- %% \Realtoks now holds decimal real no
- %% 10 times desired "real width" (rwi) in bp
- \special{PSfile=##1\space
- llx=\the\LLXtoks@\space lly=\the\LLYtoks@\space
- urx=\the\URXtoks@\space ury=\the\URYtoks@\space
- rwi=\the\Realtoks\space
- \epsfclipstring}%
- %\show\Special
- }}
- %% Minor Bug (my laziness): scaling not performed if bb width zero
- %% Rmk: Under epsf.tex only multiples of (1/10) bp available widths
- %% but considerably more accuracy available here.
-
- \let\SetDirectTeXEPSFSpecial=\SetepsfEPSFSpecial
- \let\SetCMacTeXEPSFSpecial=\SetepsfEPSFSpecial
- \let\SetOzTeXEPSFSpecial=\SetepsfEPSFSpecial
-
- %%% Old OzTeX versions (1.42 to 1.6), by Andrew Trevorrow.
- %%% For versions <= 1.41 use \SetPSprintEPSFSpecial below.
- %%% Version 1.42--1.5 may give spurious "offpage" error notices on printing.
- \def\SetOldOzTeXEPSFSpecial{\PSOrigintrue
- \gdef\EPSFSpecial##1##2{%
- \dimen4=##2pt%% convert real to dimen
- \divide\dimen4 by 1000\relax
- \Real{\dimen4}%% dimens 0,2 used here
- \edef\Aux@{\the\Realtoks}%% convert dimen to real
- \special{epsf=\string"##1\string"\space scale=\Aux@}%
- }}
-
- %% PSprint, by AndrewTrevorrow for VaX VMS
- %% and OzTeX versions <= 1.41
- % tested 2-91 by Max Calviani <ISICA@ASTRPD.infn.it>
- \def\SetPSprintEPSFSpecial{\PSOriginfalse % artifice; see below
- \gdef\EPSFSpecial##1##2{%note order
- \special{##1\space
- ##2 1000 div \the\mag\space 1000 div mul
- ##2 1000 div \the\mag\space 1000 div mul scale
- \the\LLXtoks@\space neg \the\LLYtoks@\space neg translate
- }}}
-
- %% DVILASER/PS driver originally written by David Fuchs
- % marketed and supported by ArborTeXt 535 W. William St.
- % Suite 300, Ann Arbor, MI 48103, U.S.A
- % (313) 996-3566 (313) 996-3573
- % help@arbortext.com, Andrew Dobrowolski
- \def\SetArborEPSFSpecial{\PSOriginfalse % check!
- \gdef\EPSFSpecial##1##2{%
- \edef\specialthis{##2}%
- \SPLIT@0.@\specialthis.@\relax % suppress decimals (nec!)
- \special{ps: epsfile ##1\space \the\Initialtoks@}}}
-
- %% dvitops, (c) James Clark <jjc@jclark.uucp>
- % public domain; distributed by UK TeX Archive
- % computers: unix, msdos, vms, primos and vm/cms,
- % introduced by S. Ratz <spqr@uk.ac.southampton.ecs>
- \def\SetClarkEPSFSpecial{\PSOriginfalse % please test!
- \gdef\EPSFSpecial##1##2{%
- \Rescale {\Wd@@}{##2pt}{1000pt}%
- \Rescale {\Ht@@}{##2pt}{1000pt}%
- \special{dvitops: import
- ##1\space\the\Wd@@\space\the\Ht@@}}}
-
- %% DVIPSONE, for PC compatibles
- % Y&Y, 106 Indian Hill, Carlisle MA 01741, USA
- % (508) 371-3286
- % (introduced by B. Horn <bkph@ai.mit.edu>)
- \let\SetDVIPSONEEPSFSpecial\SetUnixCoopEPSFSpecial
- \let\SetDVIPSoneEPSFSpecial\SetUnixCoopEPSFSpecial
- \let\SetDVIWindowEPSFSpecial\SetUnixCoopEPSFSpecial
-
- %% DVIALW by N. Beebe, public domain
- % DVI Driver Distribution, Center for Scientific Computing,
- % Department of Mathematics, 220 South Physics Building,
- % University of Utah, Salt Lake City, UT 84112, USA
- % (introduced by B. Horn <bkph@ai.mit.edu>)
- % Proposed standard; see TUGboat article 1993.
- \def\SetBeebeEPSFSpecial{%please test!
- \PSOriginfalse%
- \gdef\EPSFSpecial##1##2{\relax
- \special{language "PS",
- literal "##2 1000 div ##2 1000 div scale",
- position = "bottom left",
- include "##1"}}}
- \let\SetDVIALWEPSFSpecial\SetBeebeEPSFSpecial
-
- %% Northlake software
- \def\SetNorthlakeEPSFSpecial{\PSOrigintrue
- \gdef\EPSFSpecial##1##2{%
- \edef\specialthis{##2}%
- \SPLIT@0.@\specialthis.@\relax % suppress decimals (nec!)
- \special{insert ##1,magnification=\the\Initialtoks@}}}
-
- %%% OzTeX (versions 1.7 and later),
- %%% PLUS Textures, Blue Sky Research, Barry Smith
- %%% PLUS (Inline) Rokicki dvips
- %% experimental 11-94
- \def\SetOzTeXRokickiTexturesEPSFMultiSpecial{\PSOriginfalse
- \gdef\EPSFSpecial##1##2{%
- \dimen4=##2pt%% convert real to dimen
- \divide\dimen4 by 1000\relax
- \Real{\dimen4}%% dimens 0,2 used here
- \edef\Aux@{\the\Realtoks}%% convert dimen to real
- \special{epsf=\string"##1\string"\space scale=\Aux@}%
- %
- \relax
- \edef\specialtemp{##2}%
- \SPLIT@0.@\specialtemp.@\relax
- \special{illustration ##1 scaled \the\Initialtoks@}%
- %
- \dimen4=##2pt% convert real to dimen
- \divide\dimen4 by 1000\relax
- \Real{\dimen4}% dimens 0,2 used here
- \edef\Aux@{\the\Realtoks}%
- %%convert dimen to real
- \special{ps::[begin] 10 10 0 0 10 10 startTexFig\space
- \the\mag\space 1000 div \Aux@\space mul
- \the\mag\space 1000 div \Aux@\space mul scale
- \the\LLXtoks@\space neg \the\LLYtoks@\space neg translate
- %% LLX, LLY the lower left corner
- }%
- \special{ps: plotfile ##1}%
- \special{ps::[end] endTexFig}%
- }}
-
- \def\SetStandardEPSFSpecial{%
- \gdef\EPSFSpecial##1##2{%
- \ms@g{}
- \ms@g{%
- !!! Sorry! There is still no standard for \string%
- \special\space EPSF integration !!!}%
- \ms@g{%
- --- So you will have to identify your driver using a command}%
- \ms@g{%
- --- of the form \string\Set...EPSFSpecial, in order to get}%
- \ms@g{%
- --- your graphics to print. See BoxedEPS.doc.}%
- \ms@g{}
- \gdef\EPSFSpecial####1####2{}
- }}
-
- \SetStandardEPSFSpecial %% currently gives warning
-
- \let\wlog\wlog@ld %%restore logging
-
- \catcode`\:=\C@tColon
- \catcode`\;=\C@tSemicolon
- \catcode`\?=\C@tQmark
- \catcode`\!=\C@tEmark
- \catcode`\"=\C@tDqt
-
- \catcode`\@=\EPSFCatAt
-
- \endinput
-
- %%%%%%%%%%%% ASCII Character test
- %
- % Upper case letters: ABCDEFGHIJKLMNOPQRSTUVWXYZ
- % Lower case letters: abcdefghijklmnopqrstuvwxyz
- % Digits: 0123456789
- % Square, curly, angle braces, parentheses: [] {} <> ()
- % Backslash, slash, vertical bar: \ / |
- % Punctuation: . ? ! , : ;
- % Underscore, hyphen, equals sign: _ - =
- % Quotes--right left double: ' ` "
- %"at", "number" "dollar", "percent", "and": @ # $ % &
- % "hat", "star", "plus", "tilde": ^ * + ~
- %
- %%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Une seule erreur de transmission peut empoisoner un programme!
- %
- % A single transmission error can poison a whole program.
- %
- %%%%%%%%%%%%%%%%%%%%%%%%
-